<!-- <script>
  // function fn() {
  //   let a = 110;
  //   console.log(a);

  //   let obj = { b: 220 }
  //   console.log(obj);
  // }
  // 当函数调用完毕后，函数内部开辟的内存空间，会在合适的时机被垃圾回收器回收。
  // 如果内存不一直不会回收，就会造成内存空间的泄露
  // fn();


  // --------------------------- 
  // function fn(){
  //   let obj = {a:110}
  //   window.a = obj;
  // }
  // fn(); // 函数调用完后，{a:110}这个堆空间不会回收

  // --------------------------- 
  // function getDataFns() {
  //   const data = {};  // 闭包
  //   return {
  //     get(key) {
  //       return data[key]
  //     },
  //     set(key, value) {
  //       data[key] = value
  //     }
  //   }
  // }
  // const { get, set } = getDataFns();
  // set("a", 110);
  // console.log(get("a"));;

  // --------------------------- 

  // 垃圾回收：
  //   很早之前的浏览器：引用计数
  //   现代的浏览器：标记清除

  // --------------------------- 

  // 如果一个空间没有任何引用
  // 浏览器的GC，会在合适的时机进行回收
  // let a = { x: 110 }
  // let b = a;
  // b = 1;
  // a = 10;

  // 使用引用计数，造成循环引用
  // const obj1 = {};
  // const obj2 = {};
  // obj1.a = obj2
  // obj2.a = obj1;

  // 标记清除就是从根上开始遍历，如果遍历不到，就会当成垃圾来清除
  let a = { x: 110 }
  // let b = a;
  // b = 1;
  // a = 10;


</script> -->

<!-- <script>
  // data引用着堆空间，是强引用
  const data = {};

  function fn(){
    const obj = {a:1};
    data.obj = obj;
  }
  fn();
  data.obj = null
</script> -->

<!-- <script>
  const map = new Map();

  function fn() {
    const obj = { a: 1 };
    map.set("a",obj)
  }
  fn();
</script> -->

<script>
  // WeakMap和WeakSet中的引用是弱引用
  const wMap = new WeakMap();

  function fn() {
    const obj = { a: 1 };
    wMap.set(obj,100); // weakMap的key只能是引用类型
  }
  fn();
</script>
